
package tema6;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="ContadorDosServlet", urlPatterns={"/tema6/contadorDos"})
public class ContadorDosServlet extends HttpServlet {
    private final String nombreContadorServlet = "contadorUsuarioServletDos";
    private final String nombreContadorContexto = "contadorContexto";
    private int contadorServlet = 0;
    
    protected void procesaPeticion(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        
        ServletContext contexto = request.getServletContext();
        
        int contadorUsuarioServlet = visitasCookieContadorServlet(request.getCookies());
        contadorUsuarioServlet++;
        response.addCookie(new Cookie(nombreContadorServlet,String.valueOf(contadorUsuarioServlet)));        
        contadorServlet++;
        int contadorContexto = visitasContadorContexto(contexto);
        contadorContexto++;
        contexto.setAttribute(nombreContadorContexto,String.valueOf(contadorContexto));
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<link rel=\"stylesheet\" title=\"standar\" type=\"text/css\" href=\"/EjemploBasicoJavaEE/standar.css\">");
            out.println("<title>Servlet Contadores DOS</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Contadores del Servlet DOS</h1>");
            
            out.println("<h3><b>Visitas de usted a esta URL</b>: "+contadorUsuarioServlet+"</h3>");                     
            out.println("<br><h3><b>Visitas totales a este contador</b>: "+contadorServlet+"</h3>");
            out.println("<br><h3><b>Visitas totales a cualquier contador</b>: "+contadorContexto+"</h3>");
            
            out.println("<h4>Eso es todo!!</h4>");
            out.println("</body>");
            out.println("</html>");
            
        } finally { 
            out.close();
        }
    }   
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        procesaPeticion(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        procesaPeticion(request, response);
    }

    private int visitasCookieContadorServlet(Cookie[] cookies) {
        int contadorUsuarioServlet = 0;
        
        if(cookies != null) {
            for(Cookie cookie : cookies) {
                if(cookie.getName().equals(nombreContadorServlet)){
                    try{
                        contadorUsuarioServlet = Integer.parseInt(cookie.getValue());
                    } catch(NumberFormatException e){
                        contadorUsuarioServlet = 1;
                        Logger.getLogger(ContadorUnoServlet.class.getName()).log(Level.SEVERE,
                        "Parametros de la cookie alterados, no es un numero", e);
                    }
                }
            }
        }
        
        return contadorUsuarioServlet;
    }

    private int visitasContadorContexto(ServletContext contexto) {
        int visitasContexto = 0;
        
        String contadorContexto = (String) contexto.getAttribute(nombreContadorContexto);
        if(contadorContexto != null) {
            try{
                visitasContexto = Integer.parseInt(contadorContexto);
            } catch(NumberFormatException e){
                visitasContexto = 1;
                Logger.getLogger(ContadorUnoServlet.class.getName()).log(Level.SEVERE,
                "Error Parseando el contador de contexto", e);
            }
        }
        
        return visitasContexto;
    }

}
